package org.papervision3d.objects.special;

import org.papervision3d.core.geom.TriangleMesh3D;
import org.papervision3d.core.math.Matrix3D;
import org.papervision3d.core.proto.MaterialObject3D;
import org.papervision3d.core.render.data.RenderSessionData;
import org.papervision3d.objects.DisplayObject3D;

/**
 * @author Tim Knip
 */ 
public class Skin3D extends TriangleMesh3D
{
	public function new(material:MaterialObject3D, vertices:Array, faces:Array, name:String=null)
	{
		super(material, vertices, faces, name);
	}
	
	public override function project(parent:DisplayObject3D, renderSessionData:RenderSessionData):Float
	{
		// skins are already transformed into world-space by the skinning algorithm!
		// so we need to set its #transform to the parent#transform and invert...
		this.transform.copy(parent.world);
		this.transform.invert();
		
		return super.project(parent, renderSessionData);
	}

	public override function clone():DisplayObject3D
	{
		var object:DisplayObject3D = super.clone();
		var mesh:Skin3D = new Skin3D(this.material, [], [], object.name);
		
		if(this.materials)
		{
			mesh.materials = this.materials.clone();
		}
			
		if(object.geometry)
		{
			mesh.geometry = object.geometry.clone(mesh);
		}
			
		mesh.copyTransform(this);
		
		return mesh;
	}
}